home *** CD-ROM | disk | FTP | other *** search
/ Technotools / Technotools (Chestnut CD-ROM)(1993).ISO / unix / minix / minix.txt < prev    next >
Text File  |  1979-12-31  |  19KB  |  462 lines

  1. 
  2.  
  3.  
  4.  
  5.  
  6.  
  7.          MINIX: A CHEAP UNIX CLONE WITH SOURCE CODE
  8.  
  9.                     Andrew S. Tanenbaum
  10.  
  11.          Dept. of Mathematics and Computer Science
  12.                      Vrije Universiteit
  13.                  Amsterdam, The Netherlands
  14.  
  15.  
  16.  
  17.  
  18.  
  19. 1.  OVERVIEW OF THE MINIX SYSTEM ARCHITECTURE
  20.      UNIX- is organized as a single executable program  that
  21. is  loaded  into  memory  at  system boot time and then run.
  22. MINIX is structured in a much more modular way, as a collec-
  23. tion  of processes that communicate with each other and with
  24. user processes by sending and receiving messages.  There are
  25. separate  processes for the memory manager, the file system,
  26. for each device driver, and for certain other  system  func-
  27. tions.   This  structure enforces a better interface between
  28. the pieces.  The file system cannot, for  example,  acciden-
  29. tally  change  the  memory manager's tables because the file
  30. system and  memory  manager  each  have  their  own  private
  31. address spaces.
  32.      These system processes are each full-fledged processes,
  33. with  their  own  memory allocation, process table entry and
  34. state.  They can be run, blocked, and send messages, just as
  35. the  user  processes.   In fact, the memory manager and file
  36. system each run in user space as  ordinary  processes.   The
  37. device  drivers are all linked together with the kernel into
  38. the same binary program,  but  they  communicate  with  each
  39. other and with the other processes by message passing.
  40.      When the system is compiled, four binary  programs  are
  41. independently  created:  the  kernel  (including  the driver
  42. processes), the memory manager, the file  system,  and  init
  43. (which  reads  /etc/ttys and forks off the login processes).
  44. In other words, compiling the system results  in  four  dis-
  45. tinct  a.out  files.  When the system is booted, all four of
  46. these are read into memory from the boot diskette.
  47.      It is possible, and in fact, normal, to modify,  recom-
  48. pile,  and  relink,  say, the file system, without having to
  49. relink the other three pieces.  This design provides a  high
  50. degree of modularity by dividing the system up into indepen-
  51. dent pieces, each with a well-defined function and interface
  52. to  the other pieces.  The pieces communicate by sending and
  53. receiving messages.
  54.      The various processes are structured in four layers:
  55.  
  56.    4. The user processes (top layer).
  57.    3. The server processes (memory manager and file system).
  58. _________________________
  59. - UNIX is a trademark of AT&T Bell Laboratories.
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.    2. The device drivers, one process per device.
  74.    1. Process and message handling (bottom layer).
  75.  
  76. Let us now briefly summarize the function of each layer.
  77.      Layer 1 is  concerned  with  doing  process  management
  78. including  CPU  scheduling  and  interprocess communication.
  79. When a process does a SEND or RECEIVE, it traps to the  ker-
  80. nel,  which  then tries to execute the command.  If the com-
  81. mand cannot be executed (e.g., a process does a RECEIVE  and
  82. there are no messages waiting for it), the caller is blocked
  83. until the command can be executed, at which time the process
  84. is  reactivated.  When an interrupt occurs, layer 1 converts
  85. it into a message to the appropriate  device  driver,  which
  86. will normally be blocked waiting for it.  The decision about
  87. which process to run when is also made in layer 1.  A prior-
  88. ity algorithm is used, giving device drivers higher priority
  89. over ordinary user processes, for example.
  90.      Layer 2 contains the device drivers,  one  process  per
  91. major  device.   These  processes  are  part of the kernel's
  92. address space because they must run in kernel mode to access
  93. I/O device registers and execute I/O instructions.  Although
  94. the IBM PC does not have user mode/kernel mode,  most  other
  95. machines  do,  so  this  decision  has been made with an eye
  96. toward the future.  To distinguish the processes within  the
  97. kernel  from  those  in user space, the kernel processes are
  98. called tasks.
  99.      Layer 3 contains only two processes, the memory manager
  100. and  the  file system.  They are both structured as servers,
  101. with the user processes as clients.   When  a  user  process
  102. (i.e.,  a  client) wants to execute a system call, it calls,
  103. for example,  the  library  procedure  read  with  the  file
  104. descriptor, buffer, and count.  The library procedure builds
  105. a message containing the system call number and the  parame-
  106. ters  and  sends  it  to  the  file system.  The client then
  107. blocks waiting for a reply.  When the file  system  receives
  108. the  message,  it carries it out and sends back a reply con-
  109. taining the number of bytes read or  the  error  code.   The
  110. library  procedure  gets the reply and returns the result to
  111. the caller in the usual way.  The user is completely unaware
  112. of  what  is  going  on  here, making it easy to replace the
  113. local file system with a remote one.
  114.      Layer 4 contains the user programs.   When  the  system
  115. comes  up,  init  forks off login processes, which then wait
  116. for input.  On a successful login, the  shell  is  executed.
  117. Processes  can  fork, resulting in a tree of processes, with
  118. init at the root.  When CTRL-D  is  typed  to  a  shell,  it
  119. exits,  and  init replaces the shell with another login pro-
  120. cess.
  121.  
  122. 2.  LAYER 1 - PROCESSES AND MESSAGES
  123.      The two basic concepts on  which  MINIX  is  built  are
  124. processes  and  messages.   A  process  is  an independently
  125. schedulable entity with its own process table entry.  A mes-
  126. sage  is a structure containing the sender's process number,
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.                            - 2 -
  137.  
  138.  
  139. a message type field, and a variable part (a union) contain-
  140. ing  the  parameters or reply codes of the message.  Message
  141. size is fixed, depending on how big the union happens to  be
  142. on the machine in question.  On the IBM PC it is 24 bytes.
  143.      Three kernel calls are provided:
  144.  
  145.    - RECEIVE(source, &message)
  146.    - SEND(destination, &message)
  147.    - SENDREC(process, &message)
  148.  
  149. These are the only true system calls  (i.e.,  traps  to  the
  150. kernel).  RECEIVE announces the willingness of the caller to
  151. accept a message from a specified process, or  ANY,  if  the
  152. RECEIVER  will  accept  any  message.  (From here on, ``pro-
  153. cess'' also includes the tasks.) If no message is available,
  154. the receiving process is blocked.  SEND attempts to transmit
  155. a message to the destination process.   If  the  destination
  156. process  is  currently  blocked  trying  to receive from the
  157. sender, the kernel copies  the  message  from  the  sender's
  158. buffer to the receiver's buffer, and then marks them both as
  159. runnable.  If the receiver is not waiting for a message from
  160. the sender, the sender is blocked.
  161.      The SENDREC primitive combines  the  functions  of  the
  162. other two.  It sends a message to the indicated process, and
  163. then blocks until a reply  has  been  received.   The  reply
  164. overwrites the original message.  User processes use SENDREC
  165. to execute system calls by sending messages to  the  servers
  166. and then blocking until the reply arrives.
  167.      There are two ways to enter the kernel.  One way is  by
  168. the  trap  resulting  from  a  process'  attempt  to send or
  169. receive a message.  The other way is by an interrupt.   When
  170. an  interrupt occurs, the registers and machine state of the
  171. currently running process are saved  in  its  process  table
  172. entry.   Then a general interrupt handler is called with the
  173. interrupt number as parameter.  This procedure builds a mes-
  174. sage of type INTERRUPT, copies it to the buffer of the wait-
  175. ing task, marks that task as runnable (unblocked), and  then
  176. calls the scheduler to see who to run next.
  177.      The scheduler maintains three queues, corresponding  to
  178. layers  2, 3, and 4, respectively.  The driver queue has the
  179. highest priority, the server queue has middle priority,  and
  180. the  user  queue  has lowest priority.  The scheduling algo-
  181. rithm is simple: find the highest priority queue that has at
  182. least  one  process on it, and run the first process on that
  183. queue.  In this way, a clock interrupt will cause a  process
  184. switch  if  the file system was running, but not if the disk
  185. driver was running.  If the disk  driver  was  running,  the
  186. clock  task  will  be put at the end of the highest priority
  187. queue, and run when its turn comes.
  188.      In addition to this rule,  once  every  100  msec,  the
  189. clock  task  checks  to see if the current process is a user
  190. process that has been running for at least 100 msec.  If so,
  191. that  user  is  removed from the front of the user queue and
  192. put on the back.  In effect, compute  bound  user  processes
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202.                            - 3 -
  203.  
  204.  
  205. are run using a round robin scheduler.  Once started, a user
  206. process runs until  either  it  blocks  trying  to  send  or
  207. receive a message, or it has had 100 msec of CPU time.  This
  208. algorithm is simple, fair, and easy to implement.
  209.  
  210. 3.  LAYER 2 - DEVICE DRIVERS
  211.      Like all versions of UNIX for the IBM  PC,  MINIX  does
  212. not  use  the  ROM BIOS for input or output because the BIOS
  213. does not support interrupts.  Suppose a  user  forks  off  a
  214. compilation in the background and then calls the editor.  If
  215. the editor tried to read from the terminal using  the  BIOS,
  216. the  compilation  (and  any  other  background  jobs such as
  217. printing) would be stopped dead in their tracks waiting  for
  218. the  the  next  character to be typed.  Such behavior may be
  219. acceptable in the MS-DOS world, but it certainly is  not  in
  220. the  UNIX world.  As a result, MINIX contains a complete set
  221. of drivers that duplicate the functions of the  BIOS.   Like
  222. the  rest  of  MINIX,  these  drivers  are written in C, not
  223. assembly language.
  224.      This design  has  important  implications  for  running
  225. MINIX  on PC clones.  A clone whose hardware is not compati-
  226. ble with the PC down to the chip level, but which  tries  to
  227. hide  the  differences by making the BIOS calls functionally
  228. identical to IBM's will not run an unmodified MINIX  because
  229. MINIX does not use the BIOS.
  230.      Each device driver is a separate process in MINIX.   At
  231. present,  the  drivers  include  the  clock driver, terminal
  232. driver, various disk drivers (e.g., RAM disk, floppy  disk),
  233. and  printer driver.  Each driver has a main loop consisting
  234. of three actions:
  235.  
  236.    1. Wait for an incoming message.
  237.    2. Perform the request contained in the message.
  238.    3. Send a reply message.
  239.  
  240. Request messages have  a  standard  format,  containing  the
  241. opcode  (e.g.,  READ,  WRITE,  or  IOCTL),  the minor device
  242. number, the position (e.g., disk block number),  the  buffer
  243. address,  the  byte  count, and the number of the process on
  244. whose behalf the work is being done.
  245.      As an example of where device drivers fit in,  consider
  246. what  happens  when  a  user wants to read from a file.  The
  247. user sends a message to the file system.  If the file system
  248. has  the  needed  data  in its buffer cache, they are copied
  249. back to the user.  Otherwise, the file system sends  a  mes-
  250. sage to the disk task requesting that the block be read into
  251. a buffer within the file  system's  address  space  (in  its
  252. cache).   Users may not send messages to the tasks directly.
  253. Only the servers may do this.
  254.      MINIX supports a RAM disk.  In fact, the  RAM  disk  is
  255. always  used  to  hold  the root device.  When the system is
  256. booted, after the operating system has been loaded, the user
  257. is  instructed to insert the root file system diskette.  The
  258. file system then sees how big it is, allocates the necessary
  259.  
  260.  
  261.  
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268.                            - 4 -
  269.  
  270.  
  271. memory, and copies the diskette to the RAM disk.  Other file
  272. systems can then be mounted on the root device.
  273.      This organization puts important  directories  such  as
  274. /bin  and /tmp on the fastest device, and also makes it easy
  275. to work with either floppy disks or hard disks or a  mixture
  276. of  the  two by mounting them on /usr or /user or elsewhere.
  277. In any event, the root device is always in the same place.
  278.      In the standard distribution, the  RAM  disk  is  about
  279. 240K,  most of which is full of parts of the C compiler.  In
  280. the 256K system, a much smaller RAM disk  has  to  be  used,
  281. which  explains why this version has no C compiler: there is
  282. no place to put it.  (The /usr diskette is  completely  full
  283. with  the other utility programs and one of the design goals
  284. was to make the system run on a 256K PC with 1 floppy disk.)
  285. Users  with  an unusual configuration such as 256K and three
  286. hard disks are free to juggle things around as they see fit.
  287.      The terminal driver is compatible with the standard  V7
  288. terminal  driver.   It  supports  cooked mode, raw mode, and
  289. cbreak mode.  It also  supports  several  escape  sequences,
  290. such as cursor positioning and reverse scrolling because the
  291. screen editor needs them.
  292.      The printer driver copies  its  input  to  the  printer
  293. character  for  character without modification.  It does not
  294. even convert line feed to carriage return + line feed.  This
  295. makes  it  possible  to  send  escape  sequences to graphics
  296. printers without the driver messing things up.   MINIX  does
  297. not  spool  output  because  floppy disk systems rarely have
  298. enough spare disk space for the spooling directory.  Instead
  299. one normally would print a file f by saying
  300.  
  301. lpr <f &
  302.  
  303. to do the printing  in  the  background.   The  lpr  program
  304. insert  carriage  returns,  expands  tabs,  and so on, so it
  305. should only be used for straight ASCII files.  On hard  disk
  306. systems, a spooler would not be difficult to write.
  307.  
  308. 4.  LAYER 3 - SERVERS
  309.      Layer 3  contains  two  server  processes:  the  memory
  310. manager  and  the  file system.  They are both structured in
  311. the same way as the device drivers, that is a main loop that
  312. accepts  requests, performs them, and then replies.  We will
  313. now look at each of these in turn.
  314.      The memory manager's job  is  to  handle  those  system
  315. calls  that  affect memory allocation, as well as a few oth-
  316. ers.  These include FORK, EXEC, WAIT, KILL,  and  BRK.   The
  317. memory  model used by MINIX is exceptionally simple in order
  318. to  accommodate  computers  without  any  memory  management
  319. hardware.  When the shell forks off a process, a copy of the
  320. shell is made in memory.  When the child does an  EXEC,  the
  321. new  core image is placed in memory.  Thereafter it is never
  322. moved.  MINIX does not swap or page.
  323.      The amount of memory allocated to the process is deter-
  324. mined  by  a  field in the header of the executable file.  A
  325.  
  326.  
  327.  
  328.  
  329.  
  330.  
  331.  
  332.  
  333.  
  334.                            - 5 -
  335.  
  336.  
  337. program, chmem, has been provided to manipulate this  field.
  338. When  a  process  is started, the text segment is set at the
  339. very bottom of the allocated memory area,  followed  by  the
  340. data  and bss.  The stack starts at the top of the allocated
  341. memory and grows downward.  The space between the bottom  of
  342. the  stack  and the top of the data segment is available for
  343. both segments to grow into as needed.  If the  two  segments
  344. meet, the process is killed.
  345.      In the past, before paging  was  invented,  all  memory
  346. allocation  schemes  worked  like this.  In the future, when
  347. even small microcomputers will use 32-bit CPUs and  1M  x  1
  348. bit  memory  chips,  the  minimum  feasible memory will be 4
  349. megabytes and this allocation scheme  will  probably  become
  350. popular  again  due  to  its  inherent simplicity.  Thus the
  351. MINIX scheme can be regarded as either  hopelessly  outdated
  352. or amazingly futuristic, as you prefer.
  353.      The memory manager keeps track of memory using  a  list
  354. of holes.  When new memory is needed, either for FORK or for
  355. EXEC, it searches the hole list and  takes  the  first  hole
  356. that  is big enough (first fit).  When a process terminates,
  357. if it is adjacent to a hole on  either  side,  the  process'
  358. memory and the hole are merged into a bigger hole.
  359.      The file system is really a  remote  file  server  that
  360. happens  to be running on the user's machine.  However it is
  361. straightforward to convert  it  into  a  true  network  file
  362. server.   All  that  needs  to be done is change the message
  363. interface and provide some way of  authenticating  requests.
  364. (In  MINIX,  the  source  field  in  the incoming message is
  365. trustworthy because it is filled in  by  the  kernel.)  When
  366. running remote, the MINIX file server maintains state infor-
  367. mation, like RFS and unlike NFS.
  368.      The MINIX file system is similar to that  of  V7  UNIX.
  369. The  i-node  is  slightly  different, containing only 9 disk
  370. addresses instead of 13, and  only  1  time  instead  of  3.
  371. These  changes  reduce the i-node from 64 bytes to 32 bytes,
  372. to store more i-nodes per disk block and reduce the size  of
  373. the in-core i-node table.
  374.      Free disk blocks and free  inodes  are  kept  track  of
  375. using bit maps rather than free lists.  The bit maps for the
  376. root device and all mounted file systems are kept in memory.
  377. When  a  file  grows,  the system makes a definite effort to
  378. allocate the new block as close as possible to the old ones,
  379. to  minimize  arm  motion.   Disk storage is not necessarily
  380. allocated one block at a time.  A minor device can  be  con-
  381. figured  to  allocate 2, 4 (or more) contiguous blocks when-
  382. ever a block is allocated.  Although this wastes disk space,
  383. these  multiblock  zones improve disk performance by keeping
  384. file blocks close together.   The  standard  parameters  for
  385. MINIX  as distributed are 1K blocks and 1K zones (i.e., just
  386. 1 block per zone).
  387.      MINIX maintains a buffer cache of recently used blocks.
  388. A  hashing algorithm is used to look up blocks in the cache.
  389. When an i-node block, directory  block,  or  other  critical
  390. block  is  modified, it is written back to disk immediately.
  391.  
  392.  
  393.  
  394.  
  395.  
  396.  
  397.  
  398.  
  399.  
  400.                            - 6 -
  401.  
  402.  
  403. Data blocks are only written back at the next SYNC  or  when
  404. the buffer is needed for something else.
  405.      The MINIX directory system and format is  identical  to
  406. that of V7 UNIX.  File names are strings of up to 14 charac-
  407. ters, and directories can be arbitrarily long.
  408.  
  409. 5.  LAYER 4 - USER PROCESSES
  410.      This layer contains init, the shell,  the  editor,  the
  411. compiler,  the utilities, and all the user processes.  These
  412. processes may only send messages to the memory  manager  and
  413. the  file system, and these servers only accept valid system
  414. call requests.  Thus the  user  processes  do  not  perceive
  415. MINIX  to be a general-purpose message passing system.  How-
  416. ever, removing the one line of code that checks if the  mes-
  417. sage  destination is valid would convert it into a much more
  418. general system (but less UNIX-like).
  419.  
  420.  
  421.  
  422.  
  423.  
  424.  
  425.  
  426.  
  427.  
  428.  
  429.  
  430.  
  431.  
  432.  
  433.  
  434.  
  435.  
  436.  
  437.  
  438.  
  439.  
  440.  
  441.  
  442.  
  443.  
  444.  
  445.  
  446.  
  447.  
  448.  
  449.  
  450.  
  451.  
  452.  
  453.  
  454.  
  455.  
  456.  
  457.  
  458.  
  459.  
  460.  
  461.  
  462.